#ifndef TORE_H
#define TORE_H

#include "Forme.hpp"

/**
 * Classe implémentant le tore pour le raytracing. Le tore est défini
 * dans un système de coordonnées intrinsèque, la transformation dans
 * le système global est automatiquement effectuée lors de
 * l'initialisation.
 *
 * Forme::baryCentre est définit comme le centre de gravité du Tore.
 *
 * @author Johan "Solo" Luisier
 * @date 2009
 */
class Tore : public Forme
{
 public:
  Tore(const Coord& pt, const VecteurU& v, const double& grand,
       const double& petit);
  ~Tore();
  Tore(const Tore& tore);
  Coord trouveIntersection(Rayon const &) const;
  VecteurU normale(Coord const &) const;
  bool estDans(Coord const &) const;
  bool estSur(Coord const &) const;
  void mapping(const Coord &, int &i, int &j, const int &frequence,
   	       const int &Hauteur, const int &Largeur) const;
  const VecteurU& axe() const;
  const Coord& point() const;
  const double& grand() const;
  const double& petit() const;
  std::ostream& affiche(std::ostream& os) const;
  Coord intrinseque(const Coord& pt) const;
  Coord intrinsequeReduite(const Coord& pt, const double& larg) const;
 protected:
  /**
   * Centre du tore.
   */
  Coord Point;
  /**
   * Axe de symétrie du tore.
   */
  VecteurU Axe;
  double R, /**< Grand rayon du tore. */
    r; /**< Petit rayon du tore. */
};

#endif // TORE_H
